6400 // PC keyboard interface constants
6401 
6402 #define KBSTATP         0x64    // kbd controller status port(I)
6403 #define KBS_DIB         0x01    // kbd data in buffer
6404 #define KBDATAP         0x60    // kbd data port(I)
6405 
6406 #define NO              0
6407 
6408 #define SHIFT           (1<<0)
6409 #define CTL             (1<<1)
6410 #define ALT             (1<<2)
6411 
6412 #define CAPSLOCK        (1<<3)
6413 #define NUMLOCK         (1<<4)
6414 #define SCROLLLOCK      (1<<5)
6415 
6416 #define E0ESC           (1<<6)
6417 
6418 // Special keycodes
6419 #define KEY_HOME        0xE0
6420 #define KEY_END         0xE1
6421 #define KEY_UP          0xE2
6422 #define KEY_DN          0xE3
6423 #define KEY_LF          0xE4
6424 #define KEY_RT          0xE5
6425 #define KEY_PGUP        0xE6
6426 #define KEY_PGDN        0xE7
6427 #define KEY_INS         0xE8
6428 #define KEY_DEL         0xE9
6429 
6430 // C('A') == Control-A
6431 #define C(x) (x - '@')
6432 
6433 static uchar shiftcode[256] =
6434 {
6435   [0x1D] CTL,
6436   [0x2A] SHIFT,
6437   [0x36] SHIFT,
6438   [0x38] ALT,
6439   [0x9D] CTL,
6440   [0xB8] ALT
6441 };
6442 
6443 static uchar togglecode[256] =
6444 {
6445   [0x3A] CAPSLOCK,
6446   [0x45] NUMLOCK,
6447   [0x46] SCROLLLOCK
6448 };
6449 
6450 static uchar normalmap[256] =
6451 {
6452   NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00
6453   '7',  '8',  '9',  '0',  '-',  '=',  '\b', '\t',
6454   'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10
6455   'o',  'p',  '[',  ']',  '\n', NO,   'a',  's',
6456   'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20
6457   '\'', '`',  NO,   '\\', 'z',  'x',  'c',  'v',
6458   'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30
6459   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
6460   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
6461   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
6462   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
6463   [0x9C] '\n',      // KP_Enter
6464   [0xB5] '/',       // KP_Div
6465   [0xC8] KEY_UP,    [0xD0] KEY_DN,
6466   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
6467   [0xCB] KEY_LF,    [0xCD] KEY_RT,
6468   [0x97] KEY_HOME,  [0xCF] KEY_END,
6469   [0xD2] KEY_INS,   [0xD3] KEY_DEL
6470 };
6471 
6472 static uchar shiftmap[256] =
6473 {
6474   NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00
6475   '&',  '*',  '(',  ')',  '_',  '+',  '\b', '\t',
6476   'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10
6477   'O',  'P',  '{',  '}',  '\n', NO,   'A',  'S',
6478   'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20
6479   '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',
6480   'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',  // 0x30
6481   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,
6482   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40
6483   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',
6484   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50
6485   [0x9C] '\n',      // KP_Enter
6486   [0xB5] '/',       // KP_Div
6487   [0xC8] KEY_UP,    [0xD0] KEY_DN,
6488   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
6489   [0xCB] KEY_LF,    [0xCD] KEY_RT,
6490   [0x97] KEY_HOME,  [0xCF] KEY_END,
6491   [0xD2] KEY_INS,   [0xD3] KEY_DEL
6492 };
6493 
6494 
6495 
6496 
6497 
6498 
6499 
6500 static uchar ctlmap[256] =
6501 {
6502   NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
6503   NO,      NO,      NO,      NO,      NO,      NO,      NO,      NO,
6504   C('Q'),  C('W'),  C('E'),  C('R'),  C('T'),  C('Y'),  C('U'),  C('I'),
6505   C('O'),  C('P'),  NO,      NO,      '\r',    NO,      C('A'),  C('S'),
6506   C('D'),  C('F'),  C('G'),  C('H'),  C('J'),  C('K'),  C('L'),  NO,
6507   NO,      NO,      NO,      C('\\'), C('Z'),  C('X'),  C('C'),  C('V'),
6508   C('B'),  C('N'),  C('M'),  NO,      NO,      C('/'),  NO,      NO,
6509   [0x9C] '\r',      // KP_Enter
6510   [0xB5] C('/'),    // KP_Div
6511   [0xC8] KEY_UP,    [0xD0] KEY_DN,
6512   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,
6513   [0xCB] KEY_LF,    [0xCD] KEY_RT,
6514   [0x97] KEY_HOME,  [0xCF] KEY_END,
6515   [0xD2] KEY_INS,   [0xD3] KEY_DEL
6516 };
6517 
6518 
6519 
6520 
6521 
6522 
6523 
6524 
6525 
6526 
6527 
6528 
6529 
6530 
6531 
6532 
6533 
6534 
6535 
6536 
6537 
6538 
6539 
6540 
6541 
6542 
6543 
6544 
6545 
6546 
6547 
6548 
6549 
